const express = require('express');
const db = require('../db');
const md5=require('../util/md5')
const { sendSMS } = require('../util/smsUtil');
//导入判断目录是否已经存在的处理模块
const mkdir = require('../util/mkdirs')
//引入中间件
const multer = require('multer');
var fs = require('fs');
  const path = require('path'); // 导入 path 模块
const router = express.Router();
//使用multer解析FormData数据
const storage = multer.memoryStorage(); // 将文件存储在内存中
const upload = multer({ storage: storage });
//登录验证jwt包
const jwt = require("jsonwebtoken");
const { expressjwt } = require("express-jwt");
const { userInfo } = require('os');
//简易随机生成
const secretKey = 'weiyinglin';
// 参数1：用户的信息对象
// 参数2：加密的秘钥
// 参数3：配置对象，可以配置当前 token 的有效期
// 记住：千万不要把密码加密到 token 字符中


// 中间件：验证和解析 Token
const authMiddleware = (req, res, next) => {
  // 从请求头部获取 Token
  const token = req.headers.authorization.split(' ')[1]
  if (!token) {
      return res.status(401).json({ message: '未提供令牌' });
    }
  
    // 验证令牌
    jwt.verify(token, secretKey, (err, decoded) => {
      if (err) {
        return res.status(401).json({ message: '无效的令牌' });
      }
      // 将解码后的令牌数据保存到请求对象中，以便在后续处理中使用
      req.user = decoded;
  
      // 继续处理下一个中间件或路由处理函数
      next();
  });
}
// 路由处理用户密码登录模块
router.post('/loginByPassword', (req, res) => {
  // console.log(req.headers.authorization)
  // console.log(req.body.token)
  // const token =req.headers.authorization
  // const token=req.headers.authorization.split(' ')[1]
//  console.log(token)

  // const verifyToken = (token, secretKey) => {
  //   try {
  //     const decoded = jwt.verify(token, secretKey);
  //     // Token 有效，进行其他操作
  //     console.log(decoded);
  //   } catch (err) {
  //     if (err.name === 'TokenExpiredError') {
  //       // Token 过期
  //       console.log('Token expired');
  //     } else {
  //       // Token 无效
  //       console.log('Invalid token');
  //     }
  //   }
  // };
  //   // 调用验证函数
  //  verifyToken(token, secretKey);
  const {account,password}=req.body;
  const encryptedPassword = md5(password,account); // 使用MD5加密密码
 
 // 查询数据库中的账号
 const selectQuery = 'SELECT * FROM users WHERE account = ?';
  db.query(selectQuery, [account], (error, results) => {
    if (error) {
      console.error('Error executing query:', error);
      return res.status(500).json({ error: 'Error executing query' });
    }
    if (results.length === 0) {
      return res.status(404).json({ error: '该用户未注册！' });
    }
     const selectQuery = 'SELECT * FROM users WHERE account = ? AND password = ?';
      db.query(selectQuery, [account, encryptedPassword], (error, results) => {
       if (error) {
         console.error('Error executing query:', error);
         return res.status(500).json({ error: 'Error executing query' });
        }
        if (results.length === 0) {
         return res.status(402).json({ error: '用户密码不正确！' });
        }
     db.query('SELECT * FROM users JOIN userInfo ON users.account = userinfo.account WHERE users.account = ?',[account],(error,rows)=>{
      if (error) {
        console.error('Error executing query:', error);
        return res.status(500).json({ error: 'Error executing query' });
      }
      const dateObject = new Date(rows[0].birthday);
     const formattedDate = dateObject.toISOString().split('T')[0];
     rows[0].birthday=formattedDate
      // delete rows[0].id;
       delete rows[0].password
      console.log(rows[0])
      const tokenStr = jwt.sign({account:rows[0].account}, secretKey, { expiresIn: '1day' })
      return res.status(201).json({ message: '登录成功！',data:rows[0],token:tokenStr})
     })
    });
  });

 
});

//路由处理用户验证码登录模块
router.post('/loginByCode',(req,res)=>{
  const {account,code}=req.body;
  // console.log(account,code);
  //在这里对验证码进行加密
  const VerificationCode = md5(code,account);
  // 查询数据库中的账号
 const selectQuery = 'SELECT * FROM users WHERE account = ?';
 db.query(selectQuery, [account], (error, results) => {
   if (error) {
     console.error('Error executing query:', error);
     return res.status(500).json({ error: 'Error executing query' });
   }
   if (results.length === 0) {
     return res.status(404).json({ error: '该用户未注册！' });
   }
   const selectQuery = 'SELECT code FROM verification_codes WHERE phone=?';
   db.query(selectQuery, [account], (error, rows) => {
    if (error) {
      console.error('Error executing query:', error);
      return res.status(500).json({ error: 'Error executing query' });
     }   
    if(rows[0].code!==VerificationCode){
        // console.log('验证码不正确')
        return res.status(402).json({error:'验证码不正确'})
    }
    db.query('SELECT * FROM users JOIN userInfo ON users.account = userinfo.account WHERE users.account = ?',[account],(error,rows)=>{
      if (error) {
        console.error('Error executing query:', error);
        return res.status(500).json({ error: 'Error executing query' });
      }
      // delete rows[0].id;
      // console.log(rows[0])
      delete rows[0].password
      const tokenStr = jwt.sign({account:rows[0].account}, secretKey, { expiresIn: '1day' })
      return res.status(201).json({ message: '登录成功！',data:rows[0],token:tokenStr})
     })
 });
  });

})

// 路由处理用户注册模块
router.post('/register',upload.none(), (req, res) => {
  const {username,account,code,password,email,gender,avatar}=req.body;
  // 检查是否已存在相同用户名或账号
  const checkExistingUserQuery = 'SELECT * FROM users WHERE account = ?';
  db.query(checkExistingUserQuery, [account], (err, rows) => {
    if (err) {
      console.error('Database error', err);
      return res.status(500).json({ message: 'Internal server error' });
    }

    if (rows.length > 0) {
      return res.status(400).json({ message: '该账号已存在，无法注册！' });
    }
   
    // 在这里进行密码加密
    const encryptedPassword = md5(password,account);
    //在这里对验证码进行加密
    const VerificationCode = md5(code,account);
    const verificationCodeQuery='SELECT code FROM verification_codes WHERE phone=?'
    db.query(verificationCodeQuery,[account],(err,rows)=>{
      if (err) {
        console.error('Error inserting user to database', err);
        return res.status(500).json({ message: '服务器错误' });
      } 
      // console.log(rows)
      if(rows.length>0){
        // console.log('查询到数据库中的验证码')
        // console.log(rows[0].code)
        if(VerificationCode==rows[0].code){
             const base64Data = avatar.replace(/^data:image\/\w+;base64,/, ""); //去掉图片base64码前面部分data:image/png;base64 
             const dataBuffer =new Buffer.from(base64Data, 'base64');// 返回一个被 string 的值初始化的新的 Buffer 实例,原始二进制数据存储在 Buffer 类的实例中，  
            // 根据路径动态创建文件夹，如果文件夹存在就不再创建文件夹，反之则创建文件夹
               mkdir.mkdirs(path.join(__dirname, `../images/${account}`));
               const avatarPath = path.join(__dirname, `../images/${account}/avatar.jpg`)
               fs.writeFile(avatarPath, dataBuffer, function (err) {//用fs写入文件
                 if (err) {
                   console.log('头像写入失败');
                 } else {
                   console.log('头像成功写入！');
                 }
               })
             //保存头像的相对地址到数据库中
             const avatarUrl = `/images/${account}/avatar.jpg`
              // 将新用户插入到数据库
              const insertUserQuery = 'INSERT INTO users (avatar,username, account, password, email, gender) VALUES (?, ?,?, ?, ?, ?)';
              db.query(insertUserQuery, [avatarUrl,username, account, encryptedPassword, email, gender], (err) => {
                if (err) {
                  console.error('Error inserting user to database', err);
                  return res.status(500).json({ message: '服务器错误' });
                } 
              //   // 返回注册成功的响应
                res.status(200).json({ message: '注册成功！' });
              });
          
        }else{
           return res.status(402).json({message:'验证码不正确'})
          
        }
      }
      else{
        return res.status(402).json({message:'验证码不正确'})
      }
      
    })
  });
});

// 用于存储上次发送验证码的时间戳
// let lastCodeSentTime = 0;
let lastCodeSentTime = 0; // 保存最后一次发送验证码的时间
let lastPhoneNumber=''
//获取手机短信验证码模块
router.post('/getIdentCode', async (req, res) => {
  try {
   const signName="小霖心理咨询预约系统";
    const templateCode="SMS_464485529";
   const templateParam="{\"code\":\"423789\"}";
    const code = Math.floor(100000 + Math.random() * 900000); // 生成随机的 6 位验证码
    // 获取当前时间
    const currentTime = new Date().toLocaleString("zh-CN", { timeZone: "Asia/Shanghai" });
    // 调整日期时间格式
    const formattedTime = currentTime.replace("年", "-").replace("月", "-").replace("日", "").replace(/\//g, "-");
   
    const mobile = req.body.account; // 获取前端传过来的手机号
    console.log(mobile)
    if(!mobile){return res.status(404).json({error:'没有输入手机号码'})}
    //防止验证码发送过于频繁的逻辑
    const now = new Date().getTime();
    if(mobile===lastPhoneNumber){
      const timeDiff = now - lastCodeSentTime;
      const timeInterval = 60000; // 60秒
      if (timeDiff < timeInterval) {
        const remainingTime = Math.floor((timeInterval - timeDiff)/1000);
        return res.status(429).json({ error: `请等待${remainingTime}秒后再发送验证码` });
      }
    }
    lastCodeSentTime = now;


    // 在这里对手机验证码进行md5密码加密
    const encryptedCode = md5(code,mobile);
    const insertCodeQuery='INSERT INTO verification_codes (phone,code,created_at) VALUES (?, ?, ?)';
    const updateCodeQuery='UPDATE  verification_codes SET code = ?, created_at = ? WHERE phone = ?';
    //将前端传过来的手机号和随机生成的6位数短信验证码存入关联数据库中
    //检查数据库中是否存在号码已注册的情况
   const checkExistingPhoneQuery='SELECT * FROM verification_codes WHERE phone=?';
    db.query(checkExistingPhoneQuery,[mobile],(err,rows)=>{
      if(err){
        console.error('该手机号码已经被注册过', err);
        return res.status(500).json({ message: '服务器错误' });
      }
      if(rows.length>0){
        // console.log('该手机验证码已经使用过，重新发送验证码')
        db.query(updateCodeQuery,[encryptedCode,formattedTime,mobile],async (err)=>{
          if (err) {
            console.error('Error inserting user to database', err);
            return res.status(500).json({ message: '服务器错误' });
          } 
          else{
            console.log(code)
           const sendResult = await sendSMS(mobile,signName,templateCode,code)
           return res.status(201).send(sendResult);
          }
        })
      }else{
        db.query(insertCodeQuery,[mobile,encryptedCode,formattedTime],async (err)=>{
          if (err) {
            console.error('Error inserting user to database', err);
            return res.status(500).json({ message: '服务器错误' });
          } 
          else{
            const sendResult = await sendSMS(mobile,signName,templateCode,code)
             // 更新上次发送的手机号
             console.log('上次手机号',lastPhoneNumber)
             lastPhoneNumber = mobile;
            res.status(201).send(sendResult);
            // res.status(201).json(code)
          }
        })
      }
    })
   
  } catch (error) {
    console.log("Got error: " + error.message);
    res.status(500).send('短信验证码发送出错！');
  }
});

//编辑用户信息接口
router.post('/editUserInfo',upload.none(),(req,res)=>{
  const {username,account,reduce,birthday,email,gender}=req.body;
  // console.log(username,account,reduce,birthday,email,gender)
  const updateUserInfoQuery='UPDATE userInfo SET username=?,reduce=?,birthday=?,email=?,gender=? WHERE account=?';
  db.query(updateUserInfoQuery,[username,reduce,birthday,email,gender,account],async(err,rows)=>{
    if (err) {
      console.error('Error inserting user to database', err);
      return res.status(500).json({ message: '服务器错误' });
    } 
    else{
      if(rows.affectedRows>0){
        // console.log(rows)
        return res.status(201).json({message:'更新用户资料成功'})
      }
      else{
        // console.log('我在这')
        return res.status(402).json({error:'更新用户资料失败'})
      }
    }
  })
  
})

//获取用户所有信息接口
router.get('/getUserInfo',(req,res)=>{
  //  const token =req.headers.authorization
//   const token=req.headers.authorization.split(' ')[1]
//  console.log(token)
  const {account}=req.query
  // console.log(account)
  // console.log(req.query.account)
  const selectQuery='SELECT * FROM users JOIN userInfo ON users.account = userinfo.account WHERE users.account = ? '
  db.query(selectQuery,[account],(error,rows)=>{
    if (error) {
      console.error('Error executing query:', error);
      return res.status(500).json({ error: 'Error executing query' });
    }
        // console.log(rows[0])
        const dateObject = new Date(rows[0].birthday);
        const formattedDate = dateObject.toISOString().split('T')[0];
        rows[0].birthday=formattedDate
        delete rows[0].id;
        // console.log(rows[0].username)
        // const tokenStr = jwt.sign({account:rows[0].account}, secretKey, { expiresIn: '20s' })
        // console.log(tokenStr)
        return res.status(201).json({message:'获取用户所有信息',data:rows[0]})
  })
  
})

//用户验证手机号接口
router.post('/verifyAccount',(req,res)=>{
  const{account,code} =req.body;
  // console.log(account,code)
  if(!code){
    return res.status(403).json({error:'验证码不能为空'})
  }
   //在这里对验证码进行加密
   const VerificationCode = md5(code,account);
  const selectQuery = 'SELECT code FROM verification_codes WHERE phone=?';
  db.query(selectQuery, [account], (error, rows) => {
   if (error) {
     console.error('Error executing query:', error);
     return res.status(500).json({ error: 'Error executing query' });
    }   
   if(rows[0].code!==VerificationCode){
       // console.log('验证码不正确')
       return res.status(402).json({error:'验证码不正确'})
   }
   return res.status(201).json({message:'验证码正确'})
  })
})

//修改新手机号码接口
router.put('/updateAccount',(req,res)=>{
  // console.log('我在这')
  // console.log(req.body)
  const {newAccount,oldAccount}=req.body
  // console.log(newAccount,oldAccount)
   // 查询数据库中的账号
 const selectQuery = 'SELECT * FROM users WHERE account = ?';
 const updateQuery= 'UPDATE users SET account =? WHERE account=?'
 const updateUserInfoQuery='UPDATE userInfo SET account =? WHERE account=?'
 db.query(selectQuery, [newAccount], (error, results) => {
   if (error) {
     console.error('Error executing query:', error);
     return res.status(500).json({ error: 'Error executing query' });
   }
   if (results.length >0) {
    return res.status(404).json({ error: '请手机绑定账号已存在' });
  }
  db.query(updateQuery,[newAccount,oldAccount],(error,rows)=>{
    if (error) {
      console.error('Error inserting user to database', error);
      return res.status(500).json({ message: '服务器错误' });
    } 
    else{
      if(rows.affectedRows>0){
        // console.log(rows)
      db.query(updateUserInfoQuery,[newAccount,oldAccount],(error)=>{
        if (error) {
          console.error('Error inserting user to database', error);
          return res.status(500).json({ message: '服务器错误' });
        } 
        else{
          return res.status(201).json({message:'修改手机号码成功'})
        }
      })
       
      }
      else{
        return res.status(402).json({error:'修改手机号码失败'})
      }

    }
   
  })
  })
})

//修改密码的接口
router.post('/updatePassword',upload.none(),(req,res)=>{
  const {account,code,oldPassword,newPassword,verifyNewPassword}=req.body
  // console.log(account,code,oldPassword,newPassword,verifyNewPassword)
     //在这里对验证码进行加密
     const VerificationCode = md5(code,account);
     const encryptedOldPassword = md5(oldPassword,account); // 使用MD5加密旧密码
     const encryptedNewPassword = md5(newPassword,account); // 使用MD5加密新密码
    //查询验证码是否正确
     const selectQuery = 'SELECT code FROM verification_codes WHERE phone=?';
     db.query(selectQuery, [account], (error, rows) => {
      if (error) {
        console.error('Error executing query:', error);
        return res.status(500).json({ error: 'Error executing query' });
       }   
      if(rows[0].code!==VerificationCode){
          // console.log('验证码不正确')
          return res.status(402).json({error:'验证码不正确'})
      }
           //判断旧密码是否正确
           const selectByOldPasswordQuery = 'SELECT * FROM users WHERE account = ? AND password = ?';
           db.query(selectByOldPasswordQuery, [account, encryptedOldPassword], (error, results) => {
            if (error) {
              console.error('Error executing query:', error);
              return res.status(500).json({ error: 'Error executing query' });
             }
             if (results.length === 0) {
              return res.status(403).json({ error: '原密码不正确！' });
             }
             
                //修改密码
                const updatePasswordQuery='UPDATE users SET password =? WHERE password=?'
                db.query(updatePasswordQuery,[encryptedNewPassword,encryptedOldPassword],(err,rows)=>{
                  if (err) {
                    console.error('Error inserting user to database', err);
                    return res.status(500).json({ message: '服务器错误' });
                  } 
                  if(rows.affectedRows>0){
                    // console.log(rows)
                    return res.status(201).json({message:'成功修改密码'})
                  }
                  else{return res.status(500).json({error:'修改失败'})}
                 })
           })

     })
})

module.exports = router;